home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / jack / transport.h < prev    next >
C/C++ Source or Header  |  2005-12-20  |  15KB  |  424 lines

  1. /*
  2.     Copyright (C) 2002 Paul Davis
  3.     Copyright (C) 2003 Jack O'Quin
  4.     
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU Lesser General Public License as published by
  7.     the Free Software Foundation; either version 2.1 of the License, or
  8.     (at your option) any later version.
  9.     
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU Lesser General Public License for more details.
  14.     
  15.     You should have received a copy of the GNU Lesser General Public License
  16.     along with this program; if not, write to the Free Software 
  17.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18.  
  19.     $Id: transport.h,v 1.19 2004/04/09 18:59:13 joq Exp $
  20. */
  21.  
  22. #ifndef __jack_transport_h__
  23. #define __jack_transport_h__
  24.  
  25. #ifdef __cplusplus
  26. extern "C" {
  27. #endif
  28.  
  29. #include <jack/types.h>
  30.  
  31. /**
  32.  * Transport states.
  33.  */
  34. typedef enum {
  35.  
  36.     /* the order matters for binary compatibility */
  37.     JackTransportStopped = 0,    /**< Transport halted */
  38.     JackTransportRolling = 1,    /**< Transport playing */
  39.     JackTransportLooping = 2,    /**< For OLD_TRANSPORT, now ignored */
  40.     JackTransportStarting = 3    /**< Waiting for sync ready */
  41.  
  42. } jack_transport_state_t;
  43.  
  44. typedef uint64_t jack_unique_t;        /**< Unique ID (opaque) */
  45.  
  46. /**
  47.  * Optional struct jack_position_t fields.
  48.  */
  49. typedef enum {
  50.  
  51.     JackPositionBBT =    0x10,    /**< Bar, Beat, Tick */
  52.     JackPositionTimecode =    0x20    /**< External timecode */
  53.  
  54. } jack_position_bits_t;
  55.  
  56. /** all valid position bits */
  57. #define JACK_POSITION_MASK (JackPositionBBT|JackPositionTimecode)
  58. #define EXTENDED_TIME_INFO
  59.  
  60. /**
  61.  * Struct for transport position information.
  62.  */
  63. typedef struct {
  64.     
  65.     /* these four cannot be set from clients: the server sets them */
  66.     jack_unique_t    unique_1;    /**< unique ID */
  67.     jack_time_t        usecs;        /**< monotonic, free-rolling */
  68.     jack_nframes_t    frame_rate;    /**< current frame rate (per second) */
  69.     jack_nframes_t    frame;        /**< frame number, always present */
  70.  
  71.     jack_position_bits_t valid;        /**< which other fields are valid */
  72.  
  73.     /* JackPositionBBT fields: */
  74.     int32_t        bar;        /**< current bar */
  75.     int32_t        beat;        /**< current beat-within-bar */
  76.     int32_t        tick;        /**< current tick-within-beat */
  77.     double        bar_start_tick;            
  78.  
  79.     float        beats_per_bar;
  80.     float        beat_type;
  81.     double        ticks_per_beat;
  82.     double        beats_per_minute;
  83.  
  84.     /* JackPositionTimecode fields:    (EXPERIMENTAL: could change) */
  85.     double        frame_time;    /**< current time in seconds */
  86.     double        next_time;    /**< next sequential frame_time
  87.                          (unless repositioned) */
  88.  
  89.     /* For binary compatibility, new fields should be allocated from
  90.      * this padding area with new valid bits controlling access, so
  91.      * the existing structure size and offsets are preserved. */
  92.     int32_t        padding[10];
  93.  
  94.     /* When (unique_1 == unique_2) the contents are consistent. */
  95.     jack_unique_t    unique_2;    /**< unique ID */
  96.  
  97. } jack_position_t;
  98.  
  99. /**
  100.  * Called by the timebase master to release itself from that
  101.  * responsibility.
  102.  *
  103.  * If the timebase master releases the timebase or leaves the JACK
  104.  * graph for any reason, the JACK engine takes over at the start of
  105.  * the next process cycle.  The transport state does not change.  If
  106.  * rolling, it continues to play, with frame numbers as the only
  107.  * available position information.
  108.  *
  109.  * @see jack_set_timebase_callback
  110.  *
  111.  * @param client the JACK client structure.
  112.  *
  113.  * @return 0 on success, otherwise a non-zero error code.
  114.  */
  115. int  jack_release_timebase (jack_client_t *client);
  116.  
  117. /**
  118.  * Prototype for the @a sync_callback defined by slow-sync clients.
  119.  * When the client is active, this callback is invoked just before
  120.  * process() in the same thread.  This occurs once after registration,
  121.  * then subsequently whenever some client requests a new position, or
  122.  * the transport enters the ::JackTransportStarting state.  This
  123.  * realtime function must not wait.
  124.  *
  125.  * The transport @a state will be:
  126.  *
  127.  *   - ::JackTransportStopped when a new position is requested;
  128.  *   - ::JackTransportStarting when the transport is waiting to start;
  129.  *   - ::JackTransportRolling when the timeout has expired, and the
  130.  *   position is now a moving target.
  131.  *
  132.  * @param state current transport state.
  133.  * @param pos new transport position.
  134.  * @param arg the argument supplied by jack_set_sync_callback().
  135.  *
  136.  * @return TRUE (non-zero) when ready to roll.
  137.  */ 
  138. typedef int  (*JackSyncCallback)(jack_transport_state_t state,
  139.                  jack_position_t *pos,
  140.                  void *arg);
  141.  
  142. /**
  143.  * Register (or unregister) as a slow-sync client, one that cannot
  144.  * respond immediately to transport position changes.
  145.  *
  146.  * The @a sync_callback will be invoked at the first available
  147.  * opportunity after its registration is complete.  If the client is
  148.  * currently active this will be the following process cycle,
  149.  * otherwise it will be the first cycle after calling jack_activate().
  150.  * After that, it runs according to the ::JackSyncCallback rules.
  151.  * Clients that don't set a @a sync_callback are assumed to be ready
  152.  * immediately any time the transport wants to start.
  153.  *
  154.  * @param client the JACK client structure.
  155.  * @param sync_callback is a realtime function that returns TRUE when
  156.  * the client is ready.  Setting @a sync_callback to NULL declares that
  157.  * this client no longer requires slow-sync processing.
  158.  * @param arg an argument for the @a sync_callback function.
  159.  *
  160.  * @return 0 on success, otherwise a non-zero error code.
  161.  */
  162. int  jack_set_sync_callback (jack_client_t *client,
  163.                  JackSyncCallback sync_callback,
  164.                  void *arg);
  165.  
  166. /**
  167.  * Set the timeout value for slow-sync clients.
  168.  *
  169.  * This timeout prevents unresponsive slow-sync clients from
  170.  * completely halting the transport mechanism.  The default is two
  171.  * seconds.  When the timeout expires, the transport starts rolling,
  172.  * even if some slow-sync clients are still unready.  The @a
  173.  * sync_callbacks of these clients continue being invoked, giving them
  174.  * a chance to catch up.
  175.  *
  176.  * @see jack_set_sync_callback
  177.  *
  178.  * @param client the JACK client structure.
  179.  * @param timeout is delay (in microseconds) before the timeout expires.
  180.  *
  181.  * @return 0 on success, otherwise a non-zero error code.
  182.  */
  183. int  jack_set_sync_timeout (jack_client_t *client,
  184.                 jack_time_t timeout);
  185.  
  186. /**
  187.  * Prototype for the @a timebase_callback used to provide extended
  188.  * position information.  Its output affects all of the following
  189.  * process cycle.  This realtime function must not wait.
  190.  *
  191.  * This function is called immediately after process() in the same
  192.  * thread whenever the transport is rolling, or when any client has
  193.  * requested a new position in the previous cycle.  The first cycle
  194.  * after jack_set_timebase_callback() is also treated as a new
  195.  * position, or the first cycle after jack_activate() if the client
  196.  * had been inactive.
  197.  *
  198.  * The timebase master may not use its @a pos argument to set @a
  199.  * pos->frame.  To change position, use jack_transport_reposition() or
  200.  * jack_transport_locate().  These functions are realtime-safe, the @a
  201.  * timebase_callback can call them directly.
  202.  *
  203.  * @param state current transport state.
  204.  * @param nframes number of frames in current period.
  205.  * @param pos address of the position structure for the next cycle; @a
  206.  * pos->frame will be its frame number.  If @a new_pos is FALSE, this
  207.  * structure contains extended position information from the current
  208.  * cycle.  If TRUE, it contains whatever was set by the requester.
  209.  * The @a timebase_callback's task is to update the extended
  210.  * information here.
  211.  * @param new_pos TRUE (non-zero) for a newly requested @a pos, or for
  212.  * the first cycle after the @a timebase_callback is defined.
  213.  * @param arg the argument supplied by jack_set_timebase_callback().
  214.  */ 
  215. typedef void (*JackTimebaseCallback)(jack_transport_state_t state,
  216.                      jack_nframes_t nframes, 
  217.                      jack_position_t *pos,
  218.                      int new_pos,
  219.                      void *arg);
  220.  
  221. /**
  222.  * Register as timebase master for the JACK subsystem.
  223.  *
  224.  * The timebase master registers a callback that updates extended
  225.  * position information such as beats or timecode whenever necessary.
  226.  * Without this extended information, there is no need for this
  227.  * function.
  228.  *
  229.  * There is never more than one master at a time.  When a new client
  230.  * takes over, the former @a timebase_callback is no longer called.
  231.  * Taking over the timebase may be done conditionally, so it fails if
  232.  * there was a master already.
  233.  *
  234.  * @param client the JACK client structure.
  235.  * @param conditional non-zero for a conditional request.
  236.  * @param timebase_callback is a realtime function that returns
  237.  * position information.
  238.  * @param arg an argument for the @a timebase_callback function.
  239.  *
  240.  * @return
  241.  *   - 0 on success;
  242.  *   - EBUSY if a conditional request fails because there was already a
  243.  *   timebase master;
  244.  *   - other non-zero error code.
  245.  */
  246. int  jack_set_timebase_callback (jack_client_t *client,
  247.                  int conditional,
  248.                  JackTimebaseCallback timebase_callback,
  249.                  void *arg);
  250.  
  251. /**
  252.  * Reposition the transport to a new frame number.
  253.  *
  254.  * May be called at any time by any client.  The new position takes
  255.  * effect in two process cycles.  If there are slow-sync clients and
  256.  * the transport is already rolling, it will enter the
  257.  * ::JackTransportStarting state and begin invoking their @a
  258.  * sync_callbacks until ready.  This function is realtime-safe.
  259.  *
  260.  * @see jack_transport_reposition, jack_set_sync_callback
  261.  * 
  262.  * @param client the JACK client structure.
  263.  * @param frame frame number of new transport position.
  264.  *
  265.  * @return 0 if valid request, non-zero otherwise.
  266.  */
  267. int  jack_transport_locate (jack_client_t *client,
  268.                 jack_nframes_t frame);
  269.  
  270. /**
  271.  * Query the current transport state and position.
  272.  *
  273.  * This function is realtime-safe, and can be called from any thread.
  274.  * If called from the process thread, @a pos corresponds to the first
  275.  * frame of the current cycle and the state returned is valid for the
  276.  * entire cycle.
  277.  *
  278.  * @param client the JACK client structure.
  279.  * @param pos pointer to structure for returning current transport
  280.  * position; @a pos->valid will show which fields contain valid data.
  281.  * If @a pos is NULL, do not return position information.
  282.  *
  283.  * @return Current transport state.
  284.  */
  285. jack_transport_state_t jack_transport_query (const jack_client_t *client,
  286.                          jack_position_t *pos);
  287.  
  288. /**
  289.  * Return an estimate of the current transport frame,
  290.  * including any time elapsed since the last transport
  291.  * positional update.
  292.  *
  293.  * @param client the JACK client structure
  294.  */
  295. jack_nframes_t jack_get_current_transport_frame (const jack_client_t *client);
  296.                          
  297. /**
  298.  * Request a new transport position.
  299.  *
  300.  * May be called at any time by any client.  The new position takes
  301.  * effect in two process cycles.  If there are slow-sync clients and
  302.  * the transport is already rolling, it will enter the
  303.  * ::JackTransportStarting state and begin invoking their @a
  304.  * sync_callbacks until ready.  This function is realtime-safe.
  305.  *
  306.  * @see jack_transport_locate, jack_set_sync_callback
  307.  * 
  308.  * @param client the JACK client structure.
  309.  * @param pos requested new transport position.
  310.  *
  311.  * @return 0 if valid request, EINVAL if position structure rejected.
  312.  */
  313. int  jack_transport_reposition (jack_client_t *client,
  314.                 jack_position_t *pos);
  315.  
  316. /**
  317.  * Start the JACK transport rolling.
  318.  *
  319.  * Any client can make this request at any time.  It takes effect no
  320.  * sooner than the next process cycle, perhaps later if there are
  321.  * slow-sync clients.  This function is realtime-safe.
  322.  *
  323.  * @see jack_set_sync_callback
  324.  *
  325.  * @param client the JACK client structure.
  326.  */
  327. void jack_transport_start (jack_client_t *client);
  328.  
  329. /**
  330.  * Stop the JACK transport.
  331.  *
  332.  * Any client can make this request at any time.  It takes effect on
  333.  * the next process cycle.  This function is realtime-safe.
  334.  *
  335.  * @param client the JACK client structure.
  336.  */
  337. void jack_transport_stop (jack_client_t *client);
  338.  
  339.  
  340. /*********************************************************************
  341.  * The following interfaces are DEPRECATED.  They are only provided
  342.  * for compatibility with the earlier JACK transport implementation.
  343.  *********************************************************************/
  344.  
  345. /**
  346.  * Optional struct jack_transport_info_t fields.
  347.  *
  348.  * @see jack_position_bits_t.
  349.  */
  350. typedef enum {
  351.  
  352.     JackTransportState =    0x1,    /**< Transport state */
  353.     JackTransportPosition = 0x2,    /**< Frame number */
  354.     JackTransportLoop =     0x4,    /**< Loop boundaries (ignored) */
  355.     JackTransportSMPTE =    0x8,    /**< SMPTE (ignored) */
  356.     JackTransportBBT =      0x10    /**< Bar, Beat, Tick */
  357.  
  358. } jack_transport_bits_t;
  359.  
  360. /**
  361.  * Deprecated struct for transport position information.
  362.  *
  363.  * @deprecated This is for compatibility with the earlier transport
  364.  * interface.  Use the jack_position_t struct, instead.
  365.  */
  366. typedef struct {
  367.     
  368.     /* these two cannot be set from clients: the server sets them */
  369.  
  370.     jack_nframes_t frame_rate;        /**< current frame rate (per second) */
  371.     jack_time_t    usecs;        /**< monotonic, free-rolling */
  372.  
  373.     jack_transport_bits_t  valid;    /**< which fields are legal to read */
  374.     jack_transport_state_t transport_state;         
  375.     jack_nframes_t         frame;
  376.     jack_nframes_t         loop_start;
  377.     jack_nframes_t         loop_end;
  378.  
  379.     long           smpte_offset;    /**< SMPTE offset (from frame 0) */
  380.     float          smpte_frame_rate;    /**< 29.97, 30, 24 etc. */
  381.  
  382.     int            bar;
  383.     int            beat;
  384.     int            tick;
  385.     double         bar_start_tick;            
  386.  
  387.     float          beats_per_bar;
  388.     float          beat_type;
  389.     double         ticks_per_beat;
  390.     double         beats_per_minute;
  391.  
  392. } jack_transport_info_t;
  393.     
  394. /**
  395.  * Gets the current transport info structure (deprecated).
  396.  *
  397.  * @param client the JACK client structure.
  398.  * @param tinfo current transport info structure.  The "valid" field
  399.  * describes which fields contain valid data.
  400.  *
  401.  * @deprecated This is for compatibility with the earlier transport
  402.  * interface.  Use jack_transport_query(), instead.
  403.  *
  404.  * @pre Must be called from the process thread.
  405.  */
  406. void jack_get_transport_info (jack_client_t *client,
  407.                   jack_transport_info_t *tinfo);
  408.  
  409. /**
  410.  * Set the transport info structure (deprecated).
  411.  *
  412.  * @deprecated This function still exists for compatibility with the
  413.  * earlier transport interface, but it does nothing.  Instead, define
  414.  * a ::JackTimebaseCallback.
  415.  */
  416. void jack_set_transport_info (jack_client_t *client,
  417.                   jack_transport_info_t *tinfo);
  418.  
  419. #ifdef __cplusplus
  420. }
  421. #endif
  422.  
  423. #endif /* __jack_transport_h__ */
  424.